﻿#region Usings

using System.Collections.Generic;

#endregion

namespace SilverBox.Extensions
{
    public static class GenericExtensions
    {
        #region Delegates

        public delegate void Callback();

        public delegate void IterationCallback<T>(T obj);

        #endregion

        /// <summary>
        /// Recorre el conjunto de elementos y ejecuta el Callback por cada uno de ellos.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="items"></param>
        /// <param name="callback">Método que se ejecutará por cada uno de los elementos.</param>
        public static void ForEach<T>(this IEnumerable<T> items, IterationCallback<T> callback)
        {
            foreach (var item in items) callback(item);
        }

        /// <summary>
        /// Comprueba si se cumple la condición y en ese caso ejecuta el Callback.
        /// </summary>
        /// <param name="condition"></param>
        /// <param name="callback">Método que se ejecutará si se cumple la condición.</param>
        public static void Do(this bool condition, Callback callback)
        {
            if (condition) callback();
        }

        /// <summary>
        /// Realiza un Cast directo.
        /// </summary>
        /// <typeparam name="T">Type al que se quiere hacer el Cast.</typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static T Cast<T>(this object obj)
        {
            return (T) obj;
        }
    }
}